package com.training.mapper;

import com.training.entity.Course;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;

@Mapper
public interface CourseMapper {

    /**
     * Get list of all non-deleted courses
     * The specific implementation of this method will be found in the CourseMapper.xml file
     * @return List of Course objects
     */
    List<Course> findAllCourses();

    /**
     * Get the total count of all non-deleted courses.
     * @return Total count of active courses
     */
    int countAllActiveCourses();

    /**
     * Find a non-deleted course by course ID
     * @param id Course ID
     * @return Course object, null if not found or logically deleted
     */
    Course findCourseById(Long id);

    /**
     * Insert a new course into the database
     * The specific implementation of this method will be found in the CourseMapper.xml file
     * @param course Course object to insert
     * @return Number of affected rows
     */
    int addCourse(Course course);

    /**
     * Update an existing course in the database
     * The specific implementation of this method will be found in the CourseMapper.xml file
     * @param course Course object to update
     * @return Number of affected rows
     */
    int updateCourse(Course course);

    /**
     * Logically delete a course (set deleted field to 1)
     * The specific implementation of this method will be found in the CourseMapper.xml file
     * @param id Course ID
     * @param teacherId Teacher ID (for authorization)
     * @return Number of affected rows
     */
    int deleteCourse(@Param("id") Long id, @Param("teacherId") Long teacherId);


    /**
     * Get list of courses by teacher ID.
     * @param teacherId Teacher ID
     * @return List of Course objects
     */
    List<Course> findCoursesByTeacherId(@Param("teacherId") Long teacherId);

    /**
     * Search courses by teacher ID and course name keyword.
     * @param teacherId Teacher ID
     * @param couNameKeyword Keyword for course name
     * @return List of Course objects
     */
    List<Course> findByTeaIdAndCouNameContaining(@Param("teacherId") Long teacherId, @Param("couNameKeyword") String couNameKeyword);

    /**
     * 将课程与班级关联起来，即向 class_course 表中插入一条记录。
     * @param classId 班级ID
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int addCourseToClass(@Param("classId") Long classId, @Param("courseId") Long courseId);

    /**
     * 检查某个课程是否已经存在于某个班级中。
     * 需要在 CourseMapper.xml 中提供对应的 <select> 语句。
     *
     * @param classId 班级ID
     * @param courseId 课程ID
     * @return 匹配的记录数 (0表示不存在，大于0表示已存在)
     */
    int isCourseInClass(@Param("classId") Long classId, @Param("courseId") Long courseId);

    /**
     * 课程点赞数加1.
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int incrementCourseLikeNum(@Param("courseId") Long courseId); // Changed @Param("id") to @Param("courseId")

    /**
     * 课程点赞数减1.
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int decrementCourseLikeNum(@Param("courseId") Long courseId); // Changed @Param("id") to @Param("courseId")

    /**
     * 课程收藏数加1.
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int incrementCourseCollNum(@Param("courseId") Long courseId); // Changed @Param("id") to @Param("courseId")

    /**
     * 课程收藏数减1.
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int decrementCourseCollNum(@Param("courseId") Long courseId); // Changed @Param("id") to @Param("courseId")

    /**
     * 根据学生ID查找已报名的课程列表。
     * @param studentId 学生ID
     * @return 已报名的课程列表
     */
    List<Course> findEnrolledCoursesByStudentId(@Param("studentId") Long studentId);


    // 新增点赞相关方法
    /**
     * 检查学生是否已经点赞了某个课程。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 匹配的记录数 (0表示未点赞，大于0表示已点赞)
     */
    int hasStudentLikedCourse(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 记录学生点赞课程。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int addStudentCourseLike(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 删除学生点赞课程记录。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int deleteStudentCourseLike(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    // 新增收藏相关方法
    /**
     * 检查学生是否已经收藏了某个课程。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 匹配的记录数 (0表示未收藏，大于0表示已收藏)
     */
    int hasStudentCollectedCourse(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 记录学生收藏课程。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int addStudentCourseCollection(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 删除学生收藏课程记录。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int deleteStudentCourseCollection(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 检查学生是否已经报名了某个课程。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 匹配的记录数 (0表示未报名，大于0表示已报名)
     */
    int checkIfStudentEnrolled(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 记录学生报名课程。
     * @param studentId 学生ID
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int enrollCourse(@Param("studentId") Long studentId, @Param("courseId") Long courseId);

    /**
     * 根据学生ID获取该学生所有收藏的课程列表。
     * @param studentId 学生ID
     * @return 收藏的课程列表
     */
    List<Course> findCollectedCoursesByStudentId(@Param("studentId") Long studentId);
}